#include <iostream>
#include <fstream>
#include <sstream>
#include <set>
#include <utility>
using namespace std;
// set中存放的元素是唯一的，不能重复
// 默认情况下，会按照元素进行升序排列
void test(){
    set<int> num;
    set<int> nums = {1, 2, 3, 4, 5};
    set<int> nums2 = nums;
    set<int> nums3(nums2.begin(), nums2.end());

    // 增强for循环
    for(auto & ele : nums3)
        cout << ele << " ";
    cout << endl;

    // 迭代器输出
    auto start = nums2.begin();
    for(; start != nums2.end(); ++start)
        cout << *start << " ";
    cout << endl;
}

void test1(){
    set<int> num;
    set<int> nums = {1, 2, 3, 4, 5};
    set<int> nums2 = nums;

    cout << "set查找操作" << endl;
    //count返回key在容器中保存的个数
    //由于set中的元素不能重复，所以只能返回0或者是1
    cout << nums.count(2) << endl;
    cout << nums.count(5) << endl;
    cout << nums.count(6) << endl;
    cout << "======================" << endl;
    
    // find 的key值不在set中
    // 返回尾后迭代器
    // 若是存在就返回该元素对应的迭代器
    set<int>::iterator it2 = nums.find(3);
    if(it2 == nums.end()){
        cout << "该元素不存在" << endl;
    }else{
        cout << *it2 << endl;
    }
    // set 没有“下标”的概念，它依赖于迭代器来访问元素
    // 这是关容器（set / map）与顺序容器的区别(vector / array)
    // 所以上面的输出需要使用 * 来解引用it2迭代器获取数据内容
}

// 补充pair的对象成员如何访问
void test2(){
    pair<int,string>nums = {1,"wangdao"};
    cout << nums.first << nums.second << endl;
    // 使用 nums.() 来访问元素
    // first代表第一个元素的第一个数据内容
    // second代表第二个元素对应的数据内容

}

// set的插入/删除操作
void test3(){
    set<int> num = {1,2,3,4,5};
    pair<set<int>::iterator,bool> ret = num.insert(4);
    if(ret.second){
        cout << "该元素插入成功：" << endl;
    }else{
        cout << "该元素插入失败，原本就存在" << endl;
    }

    // 可以直接插入一组元素
    int arr[6] = {33,13,44,67,11};
    num.insert(arr,arr + 6);

    for(auto & ele : num){
        cout << ele << " ";
    }cout << endl;

    // 大括号形式写入一组数据
    num.insert({100,23,47});
    for(auto & ele : num){
        cout << ele << " ";
    }cout << endl;

}

int main(int atgc, char * argv[])
{
    test3();
    return 0;
}

